package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.ContractProduct;
import cn.itcast.domain.cargo.ContractProductExample;
import cn.itcast.domain.cargo.Factory;
import cn.itcast.domain.cargo.FactoryExample;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.FactoryService;
import cn.itcast.web.controller.system.BaseController;
import cn.itcast.web.utils.FileUploadUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.util.StringUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("/cargo/contractProduct")
public class ContractProductController extends BaseController {

  @Reference
  private ContractProductService contractProductService;

  @Reference
  private FactoryService factoryService;

  @Autowired
  private FileUploadUtil fileUploadUtil;

  /*
        作用： 展示货物的列表
        url: http://locallhost:8080/cargo/contractProduct/list.do
        参数： contractId  购销合同的id
        返回页面： 货物的列表页面
     */
  @RequestMapping("/list")
  public String list(String contractId, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue =
      "5") int pageSize) {
    //1. 根据购销合同的id， 查询货物的数据
    ContractProductExample contractProductExample = new ContractProductExample();
    //添加查询的条件， 根据购销合同id查询
    contractProductExample.createCriteria().andContractIdEqualTo(contractId);
    PageInfo<ContractProduct> pageInfo = contractProductService.findByPage(contractProductExample, pageNum, pageSize);
    request.setAttribute("pageInfo", pageInfo);
    //2. 查询生产货物厂家的数据
    FactoryExample factoryExample = new FactoryExample();
    factoryExample.createCriteria().andCtypeEqualTo("货物");
    List<Factory> factoryList = factoryService.findAll(factoryExample);
    request.setAttribute("factoryList", factoryList);
    //3. 购销合同的id
    request.setAttribute("contractId", contractId);
    return "cargo/product/product-list";
  }

  /*
   作用: 保存添加货物
   url ： cargo/contractProduct/edit.do
   参数： ContractProduct对象
   返回： 返回货物的列表页面
   注意： 整合提醒保存与更新都是使用了edit这个方法。
    */
  @RequestMapping("/edit")
  public String edit(ContractProduct contractProduct, MultipartFile productPhoto) throws Exception {
    //由于后期需要使用到某些数据，所以我们需要补全数据
    //货物的所属公司的id
    contractProduct.setCompanyId(getLoginCompanyId());
    //货物的所属公司的名字
    contractProduct.setCompanyName(getLoginCompanyName());
    //货物创建人
    contractProduct.setCreateBy(getLoginUser().getId());
    //货物创建人所属的部门
    contractProduct.setCreateDept(getLoginUser().getDeptId());
    //七牛文件上传
    if (productPhoto != null) {
      String url = fileUploadUtil.upload(productPhoto);//返回的就是上传图片到地址
      contractProduct.setProductImage("http://" + url);//路径并没有存储http的，所以前面添加http
    }

    if (StringUtil.isEmpty(contractProduct.getId())) {
      //保存
      contractProductService.save(contractProduct);
    } else {
      //更新
      contractProductService.update(contractProduct);
    }
    //返回值一旦添加redirect或者是forward，那么则没有经过视图解析器。
    return "redirect:/cargo/contractProduct/list.do?contractId=" + contractProduct.getContractId();
  }

  /*
    作用: 进入修改货物页面
    url ： /contractProduct/toUpdate.do?id=ebf6c9a2-8c2d-482b-a509-d67c43cadb41
    参数： id 货物的id
    返回： 去到修改货物的页面 product-update.jsp
 */
  @RequestMapping("/toUpdate")
  public String toUpdate(String id) {
    //1. 根据货物的id查找对应货物对象
    ContractProduct contractProduct = contractProductService.findById(id);
    request.setAttribute("contractProduct", contractProduct);
    //2. 查询生产货物的厂家列表
    FactoryExample factoryExample = new FactoryExample();
    factoryExample.createCriteria().andCtypeEqualTo("货物");
    List<Factory> factoryList = factoryService.findAll(factoryExample);
    request.setAttribute("factoryList", factoryList);
    //3. 返回到更新页面
    return "cargo/product/product-update";
  }

  /*
  作用: 根据id删除货物
  url ： //contractProduct/delete.do?id=ebf6c9a2-8c2d-482b-a509-d67c43cadb41&contractId=xxx
  参数： id 货物的id , contractId  购销合同的id
  返回： 返回货物的列表页面
*/
  @RequestMapping("/delete")
  public String delete(String id, String contractId) {
    contractProductService.delete(id);
    return "redirect:/cargo/contractProduct/list.do?contractId=" + contractId;
  }

  /*
     作用: 进入上传货物的页面
     url ：/cargo/contractProduct/toImport.do?contractId=dbb1e341-4c5b-4b50-8c92-271c6c505b5b
     参数： contractId  购销合同的id
     返回： 返回到上传货物的页面
    */
  @RequestMapping("/toImport")
  public String toImport(String contractId) {
    request.setAttribute("contractId", contractId);
    return "cargo/product/product-import";
  }
   /*
    作用: 保存上传excel的货物数据
    url ：/cargo/contractProduct/import.do
    参数： contractId  购销合同的id ,  file  上传的excel文件
    返回： 返回到上传货物的列表
   */
  @RequestMapping("/import")
  public String importExcel(String contractId,MultipartFile file) throws IOException {
    //1. 创建一个工作薄
    XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
    //2. 读取工作单
    Sheet sheet = workbook.getSheetAt(0);
    //3. 获取总的行数
    int rows = sheet.getPhysicalNumberOfRows();
    //4. 遍历读取整个excel数据，注意：每一行就是一个货物的数据
    for (int i = 1; i < rows; i++) {
      //获取行
      Row row = sheet.getRow(i);
      //每一行就是一个货物的数据，所以我们创建一个货物的对象
      ContractProduct contractProduct = new ContractProduct();
      //读取单元格的数据封装到contractProduct对象中
      //生产厂家
      if (row.getCell(1) != null) {
        //读取数据
        String factoryName = row.getCell(1).getStringCellValue();
        //把数据封装到货物对象
        contractProduct.setFactoryName(factoryName);
      }
      //货号
      if (row.getCell(2) != null) {
        //读取数据
        String productNo = row.getCell(2).getStringCellValue();
        //把数据封装到货物对象
        contractProduct.setProductNo(productNo);
      }
      //数量
      if (row.getCell(3) != null) {
        //读取数据
        double cnumber = row.getCell(3).getNumericCellValue();
        //把数据封装到货物对象
        contractProduct.setCnumber((int) cnumber);
      }
      //包装单位
      if (row.getCell(4) != null) {
        //读取数据
        String packingUnit = row.getCell(4).getStringCellValue();
        //把数据封装到货物对象
        contractProduct.setPackingUnit(packingUnit);
      }
      //报运：装率
      if(row.getCell(5)!=null){
        //读取数据
        double loadingRate = row.getCell(5).getNumericCellValue();
        //把数据封装到货物对象
        contractProduct.setLoadingRate(loadingRate+"");
      }
      //报运：箱数
      if(row.getCell(6)!=null){
        //读取数据
        double boxNum = row.getCell(6).getNumericCellValue();
        //把数据封装到货物对象
        contractProduct.setBoxNum((int) boxNum);
      }
      //单价
      if(row.getCell(7)!=null){
        //读取数据
        double price = row.getCell(7).getNumericCellValue();
        //把数据封装到货物对象
        contractProduct.setPrice(price);
      }
      //货描
      if(row.getCell(8)!=null){
        //读取数据
        String productDesc = row.getCell(8).getStringCellValue();
        //把数据封装到货物对象
        contractProduct.setProductDesc(productDesc);
      }
      //要求
      if(row.getCell(9)!=null){
        //读取数据
        String productReq = row.getCell(9).getStringCellValue();
        //把数据封装到货物对象
        contractProduct.setProductRequest(productReq);
      }
      //补全数据 (因为有些数据我们在后期做统计模块的时候要使用到)
      //货物所属的公司id与nanme
      //该货物所属的购销合同id
      contractProduct.setContractId(contractId);
      contractProduct.setCompanyId(getLoginCompanyId());
      contractProduct.setCompanyName(getLoginCompanyName());
      //货物的生成厂家的id
      //根据厂家的名字查找厂家
      Factory factory = factoryService.findByFactoryName(contractProduct.getFactoryName());
      contractProduct.setFactoryId(factory.getId());
      //把获取的数据插入到数据库中
      contractProductService.save(contractProduct);
    }
    return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
  }
}
